<html>


<body>
    <script type="text/javascript">
        /**
         * 原型 prototype
         * 我们所创建的每一个函数，解析器都会向函数中添加一个属性 prototype
         *  这个 prototype 属性指向一个对象，这个对象就是我们所谓的原型对象
         * 
         * 
         * 如果把函数当作普通的函数来调用 prototype 都没有任何作用
         * 
         * 当函数以构造函数的形式调用时（使用new关键字）
         * 它所创建的对象中都会有一个隐含的属性，
         * 并指向该构造函数的原型对象，
         * 在创建出来的对象中，我们可以通过  __proto__ 来访问该属性
         * 
         * 原型对象就相当于一个公共的区域，所有同一个类的实例都可以访问到这个原型对象
         * 我们可以将对象中共有的内容，统一设置到原型对象中
         * （迄今为止，原型对象有点像java中的静态属性）
         * 
         * 当我们访问对象的一个属性或方法时，它会先在对象自身中查找，
         * 如果有的话就直接使用，
         * 如果没有的话，则会去原型对象中
         */

        function Person(name) {
            this.name = name
        }

        var luo = new Person("罗")

        var yan = new Person("燕")


        alert("同一个类所生成的实例对象中的原型对象指的是同一个吗？" + (luo.__proto__ === yan.__proto__))

        alert("构造函数中的原型对象和实例对象中的原型对象是同一个吗？" + (Person.prototype === luo.__proto__))


        //      向 构造 Person 函数的原型对象中添加一个属性
        Person.prototype.public = "原型对象中公共的内容"


        alert("查看对象实例中原型中的内容：----->" + (luo.__proto__.public))

        /**
         * 当我们访问对象中的一个属性或者方法时，它会先在对象自身中查找，
         * 如果对象自己本身就有，那么就直接使用
         * 如果对象自己本身没有，则就会去原型对象中查找，如果找到则直接使用
         */
        alert("以从对象属性到原型的顺序来查找公共的原型属性：----->" + (luo.public))


        //      向 yan 对象中 添加 public 属性
        yan.public = "燕本身的属性"

        alert("属性的查找顺序是：---->" + yan.public + "------>" + luo.name + "的原型中的内容被改变了嘛吗？" + (luo.public))


        // 向原型中添加方法
        Person.prototype.sayName = function() {
            alert("原型中的方法说：我的名字是：" + this.name)
        }

        luo.sayName()
        yan.sayName()
    </script>
</body>

</html>